package com.zhenxiang.juc.assist;

/**
 * @Author : James
 * @Create : 2021-12-22-15:35
 * @Description :  信号量  可以用来控制同时访问特定资源的线程数量，通过协调各个线程，以保证合理的使用资源。
 *
 *    通常用于那些资源有明确访问数量限制的场景，常用于限流 。
 */


import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 *  1、模拟停车场容纳停车总量10
 *  2、当一辆车进入停车场后，显示牌的车辆剩余位减1
 *  3、当一辆车驶离停车场后，显示牌的车辆剩余位加1
 *  4、如果车辆空闲位置小于0时，车辆在外等待。
 *
 *
 */
public class SemaphoreDemo {

    public static Semaphore semaphore = new Semaphore(10);

    public static void main(String[] args) {

        // 100辆车在等待进入停车场
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                try {
                    if (semaphore.availablePermits() <= 0) {
                        System.out.println("===========停车位已满==============");
                    }
                    //获取资源 获取停车位
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"进入停车场");
                    // 停车时长
                    TimeUnit.SECONDS.sleep(3);
                    // 驶离停车场
                    System.out.println(Thread.currentThread().getName()+"驶离停车场");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放资源 驶离停车场
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }

    }

}
